package cn.zzq.aix.nativeinterface.javareflector;

import java.util.Arrays;

public class ReflectException extends RuntimeException {

	private static final long serialVersionUID = -8129013392228108171L;

	/**
	 * 因为JR使用不当造成程序报错且有异常对象的，使用该构造函数构造ReflectException对象
	 * 
	 * @param object
	 * @param functionName
	 * @param exception
	 * @param extralMessage
	 */
	public ReflectException(Object object, String functionName, Throwable exception, Object... extralMessage) {
		super(buildRuntimeException(object, exception, functionName, extralMessage));
		Logger.log(functionName, this);
	}

	/**
	 * 因为JR使用不当造成程序报错且无异常对象的，使用该构造函数构造ReflectException对象
	 * 
	 * @param object
	 * @param functionName
	 * @param extralMessage
	 */
	public ReflectException(Object object, String functionName, Object... extralMessage) {
		this(object, functionName, null, extralMessage);
	}

	/**
	 * @param object
	 *            涉及到的对象
	 * @param exception
	 *            异常对象
	 * @param functionName
	 *            造成异常的函数块名称
	 * @param extralMessage
	 *            附加的异常说明
	 * @return 构造成功的字串
	 */
	private static String buildRuntimeException(Object object, Throwable exception, String functionName,
			Object[] extralMessage) {
		object = ArrayUtil.array2json(object);
		return "JavaReflector组件发生异常 " + //
				"\n 函数块名称: " + functionName + //
				"\n 涉及到的对象:" + object + //
				"\n 异常名称: " + (exception == null ? null : exception.getClass().getName()) + //
				"\n 异常信息:" + (exception == null ? null : exception.getMessage()) + //
				"\n 额外的异常说明:" + Arrays.toString(extralMessage);
	}
}
